//加载"cluster"模块
var cluster = require("cluster");
const os = require("os");
var express = require("express");

//创建一个Express应用程序
var app = express();

//运行主程序
// process.env.NODE_UNIQUE_ID指定cluster.isMaster
// 如果process.env.NODE_UNIQUE_ID未定义，cluster.isMaster为true。否则为false。
if(cluster.isMaster){
    //测试CPU的核数，可以任意写小于计算机的
    var cpuCount = os.cpus().length;

    //给每个CPU建立一个worker（线程）
    for(var i = 0; i < cpuCount; i++){
        cluster.fork();
    }

    //监听关闭子线程
    cluster.on('exit', function (worker) {
        //监听那个线程关闭了
        console.log("Worker %d died.", worker.id);
        cluster.fork(); //创建一个新的worker
    });
}else{
    //在Master中创建Worker后，这些worker会运行到这个条件。
    app.get('/', function (req, res, next) {
        console.log("Request to worker %d.", cluster.worker.id);
        res.send("Hello world!");
    });

    app.use(function (req, res, next) {
        console.log("Request to worker %d.", cluster.worker.id);
        res.status(404);
        res.send("Not found!");
    });

    app.use(function (err, req, res, next) {
        if(err){
            res.status(500);
            res.send("Server error!");
        }
    });

    app.listen(3000, function () {
        console.log("Server started on port 3000.");
    })
}
